package com.blq.snblib.util;

import android.app.ActivityManager;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Looper;

import java.util.List;

/**
 * ================================================
 * 作者: SSNB
 * 日期: 2016/9/14
 * 描述:
 * 检测类，返回的都是boolean
 * 主要有判断网络和判断服务
 * ================================================
 */
public class CheckUtil {

    private CheckUtil(){
        throw new IllegalAccessError("不能被创建，请使用静态方法");
    }

    /**
     * 判断网络是否连接
     * @param context 上下文对象
     * @return true wifi或数据流量开启；false wifi或数据流量都没开启
     */
    public static boolean isConnection(Context context){
        checkContext(context);
        ConnectivityManager cManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifiInfo = cManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo phoneInfo = cManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        return ((wifiInfo!=null &&wifiInfo.isConnected())
                || (phoneInfo!=null &&phoneInfo.isConnected()));
    }

    /**
     * 判断当前网络连接状态是否为Wifi
     * @param context 上下文对象
     * @return true 上网模式为Wifi，
     */
    public static boolean isWifi(Context context){
        return checkConnectedByType(context,ConnectivityManager.TYPE_WIFI);
    }

    /**
     * 判断当前网络连接状态是否为数据流量
     * @param context 上下文对象
     * @return true 上网模式为数据流量;false 当前wifi不可用或wifi未连接
     */
    public static boolean isMobile(Context context){
        return checkConnectedByType(context,ConnectivityManager.TYPE_MOBILE);
    }

    /**
     * 检查所属类型是否是连接状态
     * @param context 上下文对象
     * @param Type 类型{@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI}
     * @return true 当前连接中 false 当前为连接或出现错误
     */
    private static boolean checkConnectedByType(Context context , int Type){
        checkContext(context);
        ConnectivityManager cManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cManager.getActiveNetworkInfo();
        return (info!=null
                &&info.isConnected()
                &&(info.getType()==Type));
    }

    /**
     * 判断 context 是否为null
     * @param context 待判断的context
     */
    private static void checkContext(Context context){
        if(context==null){
            throw new IllegalAccessError("context is null");
        }
    }

    /**
     * 判断服务是否存在
     * @param context 上下文对象
     * @param ServerName 所需要服务的名字（完整名字 例如 blq.ssnb.mylib.service.MyService）
     * @return true 正在运行，false 未运行
     */
    public static boolean isServiceRuning(Context context,String ServerName){
        try {
            ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningServiceInfo> mRunningTasks = activityManager.getRunningServices(Integer.MAX_VALUE); //30表示获取的最大数

            for (ActivityManager.RunningServiceInfo amTask : mRunningTasks){
                //如果所需要判断的服务存在，那么就返回真
                if(amTask.service.getClassName().equals(ServerName)){
                    return true;
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 当前线程是否是主线程
     * @return true 主线程 false，其他线程
     */
    public static boolean isMainThread(){
        return  Thread.currentThread().equals(Looper.getMainLooper().getThread());
    }

}
